package com.vepick.metier.lancement;

import java.sql.*;
import java.util.Scanner;

import com.vepick.beans.Tache;
import com.vepick.metier.lancement.Connexion;
import com.vepick.metier.requetes.RequetesSurVehicule;
import com.vepick.metier.requetes.RequetesSurVelo;
import com.vepick.metier.requetes.Requetes_routines;
import com.vepick.metier.requetes.Requetes_station;
import com.vepick.metier.requetes.Requetes_tache;

public class InterfaceConducteur {
	public static final int DECLARER_VELO_ENDOMMAGE = 1;
	public static final int CONSULTER_SA_ROUTINE = 2;
	public static final int DEPLACER_VELOS = 3;
	public static final int VALIDER_TACHE = 4;
	public static final int DECLARER_REPARATION_LOCALE = 5;
	public static final int ANNULER_TACHE = 6;
	public static final int QUITTER_APPLICATION = 99;

	public static void main(String[] args) throws SQLException {

		// Variables locales necessaires au fonctionnement du programme
		@SuppressWarnings("resource")
		Scanner scanner = new Scanner(System.in);
		int choix = 0;
		int numVehicule = 0;

		// Connection e la base de donnees
		Connection conn = Connexion.getConnexion();

		// Demande de renseigner le numero du vehicule
		System.out.println("Veuillez entrer votre numero de vehicule :");
		numVehicule = scanner.nextInt();

		// Verification du numero de vehicule
		try {

			System.out.println("Ce vehicule a "
					+ RequetesSurVehicule.NombreDeRoutinesVehicule(conn,
							numVehicule) + " routines affectees.");
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		// Traitement du choix du client
		while (choix != QUITTER_APPLICATION) {

			switch (choix) {
			case DECLARER_VELO_ENDOMMAGE: {
				System.out.println("...Declaration d'un velo endommage...");
				
				// On recupere la tache courante
				Tache tache = RequetesSurVehicule.TacheCourrante(conn,numVehicule);
				
				// On liste les velos en mauvais etat a la station courrante
				int nb = Requetes_station.AfficherVeloDispoEnStation(conn, tache.getIdStation());
				
				if (nb == 0) {
					System.out
							.println("Il n'y a pas de velo dans cette station.");
					break;
				}
				
				System.out.println("Selectionner le velo a declarer hs :");
				int velo_reparer = scanner.nextInt();
				
				RequetesSurVelo.DeclarerVeloHS(conn, velo_reparer);

				break;
			}
			case CONSULTER_SA_ROUTINE: {
				System.out.println("...Consultation de la routine du jour...");
				// On recupere la routine du jour
				int routine = Requetes_routines.consulterRoutineDuJour(conn,
						numVehicule);

				// Verification si la routine existe
				if (routine == -1) {
					System.out
							.println("Aucune routine n'a ete affectee a votre vehicule aujourdh'hui.");
					break;
				}
				// Affichage du programme de la routine
				Requetes_routines.afficherDetailRoutine(conn, routine);
				break;
			}
			case DEPLACER_VELOS: {
				InterfaceConducteur.afficherDeplacements();
				int choix_deplacement = scanner.nextInt();

				switch (choix_deplacement) {
				case 1: {
					System.out.println("...Deplacer un velo...");
					// On recupere la tache courante
					Tache tache = RequetesSurVehicule.TacheCourrante(conn,
							numVehicule);

					// TODO : Verifier que la tache concerne une station

					// Choisir un velo
					System.out
							.println("...Mettre un velo dans le vehicule de regulation...");

					// Affichage des velos presents dans la station prevue a la
					// tache
					int cpt = Requetes_station.AfficherVeloDispoEnStation(conn,
							tache.getIdStation());

					if (cpt == 0) {
						System.out
								.println("Il n'y a plus de velo present dans cette station ("
										+ tache.getIdStation() + ")...");
						break;
					}

					// Choisir un velo
					System.out.println("Choisissez le velo a deplacer :");

					int numVelo = scanner.nextInt();

					// Deplacer le velo
					RequetesSurVelo.MettreVeloEnRegulation(conn, numVelo,
							tache.getIdTache());

					break;
				}
				case 2: {
					System.out.println("... Deposer un velo...");

					// On r�cup�re la tache courante
					Tache tache = RequetesSurVehicule.TacheCourrante(conn,
							numVehicule);

					System.out
							.println("Choisir le velo a deposer dans la station "
									+ tache.getIdStation());

					// Choisir un velo qui est present dans le vehicule de
					// regulation
					int nb_velo = RequetesSurVehicule.AfficherVeloRegules(conn,
							tache.getIdRoutines());

					if (nb_velo == 0) {
						System.out
								.println("Il n'y a pas de velo disponible dans votre vehicule de regulation.");
						break;
					}

					System.out.println("Choisissez le velo a deposer :");
					int veloADeposer = scanner.nextInt();

					// Choisir une bornette libre dans la station
					int nb_bornettes = Requetes_station
							.AfficherBorneDispoEnStation(conn,
									tache.getIdStation());

					if (nb_bornettes == 0) {
						System.out
								.println("Il n'y a plus de bornette de libre dans cette station ("
										+ tache.getIdStation() + ")...");
						break;
					}

					System.out.println("Choisissez la bornette :");
					int bornette = scanner.nextInt();

					// Deposer le velo
					RequetesSurVelo.DeposerVeloEnStation(conn, veloADeposer,
							bornette);

				}
				}
				break;
			}
			case VALIDER_TACHE: {
				System.out.println("...Validation d'une tache...");
				// On recupere la routine du jour
				int routine = Requetes_routines.consulterRoutineDuJour(conn,
						numVehicule);

				// Verification si la routine existe
				if (routine == -1) {
					System.out
							.println("Aucune routine n'a ete affectee a votre vehicule aujourdh'hui.");
					break;
				}
				// Affichage des taches non terminees
				RequetesSurVehicule.afficherIDTachesDeLaRoutine(conn, routine);

				System.out.println("Entrer la tache a valider :");
				int tache_valider = scanner.nextInt();

				// Valider la tache
				Requetes_tache.ValiderTache(conn, tache_valider);

				break;
			}
			case ANNULER_TACHE: {
				System.out.println("...Annulation d'une tache...");
				// On recupere la routine du jour
				int routine = Requetes_routines.consulterRoutineDuJour(conn,
						numVehicule);

				// Verification si la routine existe
				if (routine == -1) {
					System.out
							.println("Aucune routine n'a ete affectee a votre vehicule aujourdh'hui.");
					break;
				}
				// Affichage des taches non terminees
				RequetesSurVehicule.afficherIDTachesDeLaRoutine(conn, routine);

				System.out.println("Entrer la tache a annuler :");
				int tache_annuler = scanner.nextInt();

				// Valider la tache
				Requetes_tache.AnnulerTache(conn, tache_annuler);

				break;
			}
			case DECLARER_REPARATION_LOCALE: {
				System.out.println("...Declaration d'une reparation locale...");
				
				// On recupere la tache courante
				Tache tache = RequetesSurVehicule.TacheCourrante(conn,numVehicule);
				
				// On liste les velos en mauvais etat a la station courrante
				int nb = Requetes_station.AfficherVeloHSEnStation(conn, tache.getIdStation());
				
				if (nb == 0) {
					System.out
							.println("Il n'y a pas de velo a reparer a cette station.");
					break;
				}
				
				System.out.println("Selectionner le velo a reparer :");
				int velo_reparer = scanner.nextInt();
				
				RequetesSurVelo.ReparerVelo(conn, velo_reparer);

				break;
			}
			}

			// Affichage des differentes fonctionnalites
			afficherFonctionnalites();

			// Fonctionnalite tappee par le client
			choix = scanner.nextInt();
		}

		try {
			Connexion.getConnexion().close();
		} catch (SQLException e) {
			System.out.println("Erreur dans la fermeture de la connexion");
			e.printStackTrace();
		}
	}

	private static void afficherFonctionnalites() {
		System.out
		.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("Declarer un velo endommage : "
				+ DECLARER_VELO_ENDOMMAGE);
		System.out
				.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("Consulter sa routine : " + CONSULTER_SA_ROUTINE);
		System.out
				.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("Deplacer des velos : " + DEPLACER_VELOS);
		System.out
				.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("Valider une tache : " + VALIDER_TACHE);
		System.out
				.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("Declarer une reparation sur place : "
				+ DECLARER_REPARATION_LOCALE);
		System.out
				.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("Annuler une tache : " + ANNULER_TACHE);
		System.out
				.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("Quitter l'application : " + QUITTER_APPLICATION);
		System.out
		.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
	}

	private static void afficherDeplacements() {
		System.out
				.println("Mettre un velo dans un vehicule de regulation : " + 1);
		System.out
				.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println("Deposer un velo : " + 2);
	}
}
